package br.com.ac.fatureweb.rest.service;

import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

import br.com.ac.fatureweb.exception.AccessNaoAutorizadoException;
import br.com.ac.fatureweb.integration.billing.ContaVO;
import br.com.ac.fatureweb.integration.billing.LancamentoCobradoVO;
import br.com.ac.fatureweb.integration.billing.LogCorrecaoContaVO;
import br.com.ac.fatureweb.integration.billing.LogLeituraVO;
import br.com.ac.fatureweb.integration.billing.ProdutoVO;
import br.com.ac.fatureweb.integration.billing.ValorVO;
import br.com.ac.fatureweb.integration.billing.VolumeVO;
import br.com.ac.fatureweb.service.NgcExportacaoBean;
import br.com.ac.fatureweb.service.NgcLeituristaBean;
import br.com.ac.fatureweb.service.ValidarAcesso;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

@Path("/exportBean")
public class ExportBean {

	@Inject
	private NgcLeituristaBean ngcLeituristaBean;

	@Inject
	private NgcExportacaoBean ngcExportacaoBean;

	@GET
	@Path("ping")
	@Produces(MediaType.APPLICATION_JSON)
	public Response ping() {
		try {
			return Response.ok().entity(true).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

	@POST
	@Path("receiveRoute")
	@Produces(MediaType.APPLICATION_JSON)
	public Response receiveRoute(

			@FormParam("imei") final String imei,

			@FormParam("usuario") final Long usuario,

			@FormParam("senha") final String senha,

			@FormParam("idRoteiro") final Long idRoteiro,

			@FormParam("lstRetornoConta") final String lstRetornoConta,

			@FormParam("lstRetornoLancamentoCobrado") final String lstRetornoLancamentoCobrado,

			@FormParam("lstRetornoLogCorrecaoConta") final String lstRetornoLogCorrecaoConta,

			@FormParam("lstRetornoLogLeitura") final String lstRetornoLogLeitura,

			@FormParam("lstRetornoProduto") final String lstRetornoProduto,

			@FormParam("lstRetornoValor") final String lstRetornoValor,

			@FormParam("lstRetornoVolume") final String lstRetornoVolume) {
		try {
			if (ValidarAcesso.execute(usuario, senha, imei, ngcLeituristaBean)) {

				if (idRoteiro == null) {
					return Response
							.status(Status.PRECONDITION_FAILED)
							.entity("O id do roteiro deve ser informado para retornar os dados.")
							.build();
				}

				Gson gson = new Gson();

				List<ContaVO> lstConta = gson.fromJson(lstRetornoConta,
						new TypeToken<ArrayList<ContaVO>>() {
						}.getType());

				List<LancamentoCobradoVO> lstLancamento = gson.fromJson(
						lstRetornoLancamentoCobrado,
						new TypeToken<ArrayList<LancamentoCobradoVO>>() {
						}.getType());

				List<LogCorrecaoContaVO> lstLogCorrecao = gson.fromJson(
						lstRetornoLogCorrecaoConta,
						new TypeToken<ArrayList<LogCorrecaoContaVO>>() {
						}.getType());

				List<LogLeituraVO> lstLogLeitura = gson.fromJson(
						lstRetornoLogLeitura,
						new TypeToken<ArrayList<LogLeituraVO>>() {
						}.getType());

				List<ProdutoVO> lstProduto = gson.fromJson(lstRetornoProduto,
						new TypeToken<ArrayList<ProdutoVO>>() {
						}.getType());

				List<ValorVO> lstValor = gson.fromJson(lstRetornoValor,
						new TypeToken<ArrayList<ValorVO>>() {
						}.getType());

				List<VolumeVO> lstVolume = gson.fromJson(lstRetornoVolume,
						new TypeToken<ArrayList<VolumeVO>>() {
						}.getType());

				ngcExportacaoBean.receiveRoute(idRoteiro, lstConta,
						lstLancamento, lstLogCorrecao, lstLogLeitura,
						lstProduto, lstValor, lstVolume);

				return Response.ok().build();
			}

			return Response.status(Status.NO_CONTENT).build();
		} catch (AccessNaoAutorizadoException anae) {
			return Response.status(Status.UNAUTHORIZED)
					.entity(anae.getMessage()).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}
}
